/*
 * ColaRemotaTransmisor.h
 *
 *  Created on: Dec 13, 2013
 *      Author: m
 */

#ifndef COLAREMOTATRANSMISOR_H_
#define COLAREMOTATRANSMISOR_H_

#include <fstream>
#include <cstring>
#include "ColaRemotaComun.h"
#include "DNSService.h"
#include "Exception.h"
#include "StringUtils.h"
#include <unistd.h>
#include "ArchivoIni.h"
#include "StringUtils.h"

class ColaRemotaTransmisor
{
protected:
    int m_socket;

    void _conectar()
    {
        std::string server;
        int puertoEntrada = 0;

        // Leer la direccion del broker y el puerto del archivo de configuracion
        ArchivoIni configFile( CR_CONFIG_FILE );
        server = configFile.getValue( "defaultbroker" );
        puertoEntrada = StringUtils::StringToNumber<int>( configFile.getValue( "puertoEntrada" ) );

        // Me conecto al puerto de Entrada del servidor.
        m_socket = tcpopact( server.c_str(), puertoEntrada );
    }

public:
    ColaRemotaTransmisor() :
        m_socket( 0 )
    {
        _conectar();
    }

    virtual ~ColaRemotaTransmisor()
    {
        close( m_socket );
    }

    template <class T>
    void enviarMensaje( std::string colaDestino, T dato )
    {
        int idColaDestino;
        PaqueteColaRemota msg;
        int ack;

        // Resuelvo el ID de la cola a patir del nombre
        idColaDestino = DNSService::resolve( colaDestino );

        // Armo un paquete de capa N - 1
        msg.version = 1;       // Unused
        msg.tipoPaquete = 1;   // Unused
        msg.destino = idColaDestino;
        msg.size = sizeof( T );
        memcpy( msg.data, &dato, sizeof( T ) );

        // envio el paquete
        enviar( m_socket, &msg, sizeof( PaqueteColaRemota ) );
        recibir( m_socket, &ack, sizeof( int ) );

        if ( ack != 0 )
        {
            throw Exception( "Error en el ACK" );
        }

    }
};

#endif /* COLAREMOTATRANSMISOR_H_ */
